from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
import pandas as pd

# 初始化浏览器驱动（Chrome 为例，需替换为自己的 ChromeDriver 路径，或配置环境变量后省略 executable_path）
driver = webdriver.Chrome("D:/chromedriver/chromedriver-win64/chromedriver.exe")
# 京东手机搜索页，可按需修改关键词（如替换为 "笔记本电脑" 等）
url = 'https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_1df23921d3e44bb3b870059346314040'
driver.get(url)

# 用于存储数据
data_list = []

# 循环翻页爬取，这里示例爬取 5 页，可调整增加数据量
for page in range(5):
    # 等待页面加载完成（等待商品列表元素出现）
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'gl-item'))
    )
    # 获取页面源码
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, 'html.parser')
    # 定位商品列表
    items = soup.find_all('div', class_='gl-item')

    for item in items:
        # 商品名称
        name_tag = item.find('div', class_='p-name')
        name = name_tag.text.strip() if name_tag else '无名称'

        # 商品价格
        price_tag = item.find('strong', class_='J_price')
        price = price_tag.text.strip() if price_tag else '无价格'

        # 评论数
        comment_tag = item.find('div', class_='p-commit')
        comment = comment_tag.text.strip() if comment_tag else '0 评论'

        data_list.append([name, price, comment])

    # 点击下一页（尝试多种定位方式，优先用按钮，若失败用页码跳转，可根据实际页面调整）
    try:
        next_page_btn = driver.find_element(By.CSS_SELECTOR, 'a.pn-next')
        next_page_btn.click()
    except:
        # 若点击按钮失败，尝试通过页码输入跳转（这里简单示例，实际可优化）
        current_page = driver.find_element(By.CSS_SELECTOR, 'input.ui-page-num').get_attribute('value')
        driver.find_element(By.CSS_SELECTOR, 'input.ui-page-num').clear()
        driver.find_element(By.CSS_SELECTOR, 'input.ui-page-num').send_keys(int(current_page) + 1)
        driver.find_element(By.CSS_SELECTOR, 'a.ui-page-btn').click()

    # 等待页面跳转加载
    time.sleep(3)

# 关闭浏览器
driver.quit()

# 转换为 DataFrame 并保存（也可直接打印查看）
df = pd.DataFrame(data_list, columns=['商品名称', '价格', '评论数'])
df.to_excel('jd_phones.xlsx', index=False)
print(f'共爬取 {len(data_list)} 条数据，已保存到 jd_phones.xlsx')